package com.butterfly.hotkey.worker.util;

import cn.hutool.core.util.StrUtil;

/**
 * @author butterfly
 * @since 2024/10/19
 */
public class SystemUtil {

    private static final int CPU_CORE = Runtime.getRuntime().availableProcessors();

    private static final String VERSION_8 = "1.8.0";

    /**
     * netty worker线程数量. cpu密集型
     */
    public static int idealWorkerCount() {
        int count = CPU_CORE;
        // 新版本直接使用CPU核数
        if (!isJdkLower()) {
            return count;
        }

        // 旧版本直接使用CPU核数/2
        count = count / 2;
        return Math.max(count, 1);
    }

    /**
     * 判断JDK版本是否在1.8.0_191之前
     * <p>
     * 1.8.0_191之前的java版本，在docker内获取availableProcessors的数量都不对，会取到宿主机的cpu数量，譬如宿主机32核，
     * 该docker只分配了4核，那么老版会取到32，新版会取到4。
     * 线上事故警告！！！！！！老版jdk取到数值过大，线程数太多，导致cpu瞬间100%，大量的线程切换等待
     *
     * @return 是否在之前
     */
    public static boolean isJdkLower() {
        // 如1.8.0_20, 1.8.0_181,1.8.0_191-b12
        try {
            String javaVersion = System.getProperty("java.version");

            // 先取主版本进行比较
            String majorVersion = javaVersion.substring(0, 5);
            if (majorVersion.compareTo(VERSION_8) > 0) {
                return true;
            }
            if (majorVersion.compareTo(VERSION_8) < 0) {
                return false;
            }

            // 主版本相等，比小版本. 下面代码可能得到20，131，181，191-b12这种
            String minorVersion = javaVersion.replace("1.8.0_", "");
            // 继续截取，找"-"这个字符串，把后面的全截掉
            if (minorVersion.contains(StrUtil.UNDERLINE)) {
                minorVersion = minorVersion.substring(0, minorVersion.indexOf("-"));
            }
            return Integer.parseInt(minorVersion) >= 191;
        } catch (Exception e) {

            return false;
        }
    }

}
